<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .a{
            width: 100px;
            height: 100px;
            border: 1px solid #000;
            position: absolute;
        }
    </style>
</head>
<body>

    <div class="a"></div>

    <script>


        var oA = document.querySelector('.a') ;

        // fn() ;


        function fn () {
            //     回调函数在调用的时候，只传函数，不是传函数调用 ， 这个函数是在将来才会执行
            move(oA , 10 , 1000 , 'left' , function() {
                move(oA , 10 , 0 , 'left' , fn)
            } )
        }

        // move(oA , 10 , 1000 , 'left' , function() {
        //     move(oA , 10 , 0 , 'left' , fn)
        // })


 
        // 正向运动   speed  50
        // 反向运动   speed -50
        // 方向   direction  'left' / 'top'
        function move(ele, speed, end , direction , fn) {
            // 获取初始值
            var x = getCss(ele , direction);
            // 终点如果小于起点，说明是反向运动  速度就是负数
            // if(end < x) {
            //     speed = -speed
            // }
            speed = end < x ? -speed : speed ;
            var t = setInterval(function () {
                x += speed;
                ele.style[direction] = x + 'px';
                // 距离终点还差一个speed 就直接到达终点且清除定时器
                if (Math.abs(end - x) <= Math.abs(speed)) {
                    // 路程不一定被速度整除   必须到达终点
                    x = end;
                    ele.style[direction] = x + 'px';
                    clearInterval(t);

                    // if(fn) {
                    //     fn()
                    // }

                    // 短路运算
                    fn && fn() ;
                    
                }
            }, 2)
        }



        function getCss(ele , prop) {
            if(window.getComputedStyle) {
                return parseInt(getComputedStyle(ele)[prop])
            }
            return parseInt(ele.currentStyle[prop])
        }
    </script>
    
</body>
</html>